﻿package jkl.uitls
{
	
	/**
	 * 解析LRC文件类<br><br>
	 * 构造函数传入LRC文件的URL；<br>
	 * 公开方法：getter  lrcContext()<br>
	 * 获得解析以后的LRC数组集合<br>
	 * 该数组集合包括LRC时间（lrcTime）和LRC内容（lrcContext）<br>
	 * <hr>@author -JKL-ZT
	 */
	import flash.display.Sprite;
	import mx.rpc.events.FaultEvent;
	import mx.rpc.events.ResultEvent;	
	
	public class LyricsAnalysis extends Sprite
	{
		//常量：正则｛歌曲名称TI、歌曲歌唱家AR、专辑AL、制作人BY｝
		private const REG_TI:RegExp=/\[ti:.*\]/i;
		private const REG_AR:RegExp=/\[ar:.*\]/i;
		private const REG_AL:RegExp=/\[al:.*\]/i;
		private const REG_BY:RegExp=/\[by:.*\]/i;
		
		//常量正则｛每一句LRC的正则、时间分离正则、分离时间正则｝
		private const REG_LRC_CONTEXT:RegExp=/(.\d{1,3}){2,3}\].*/g;
		private const REG_TIME:RegExp=/(.\d{1,3}){2,3}\]/g;
		private const REG_TIME_SPLICE:RegExp= /\d{1,3}/g;
		
		//变量｛名称TI、歌唱家AR、专辑AL、制作人BY、最终的LRC数组｝
		private var _ti:String="";
		private var _ar:String="";
		private var _al:String="";
		private var _by:String="";
		private var _lrcContext:Array=new Array();
		
		//获取到的LRC内容
		private var LRC:String=new String();
		
		//构造
		
		public function LyricsAnalysis(lrc:String="")
		{
			super();
			this.LRC=lrc;
			_ti=getTi(LRC);
			_ar=getAr(LRC);
			_al=getAl(LRC);
			_by=getBy(LRC);
			_lrcContext=getLrcContext(LRC);
			_lrcContext.sortOn("lrcTime",16);
		}
		public function get lrcContext():Array{
			return _lrcContext;
		}
		public function get ti():String{
			return _ti;
		}
		public function get ar():String{
			return _ar;
		}
		public function get al():String{
			return _al;
		}
		public function get by():String{
			return _by;
		}
		//各个处理过程、、、、、、、、、、、、、、、、、、、////////////////////
		
		//得到TI
		private function getTi(lrc:String):String{
			var _str:String=new String();
			///////使用try----兼容  无   [TI:%%%%%]   标签
			try{
				var _arr:Array=lrc.match(REG_TI);
				_str=_arr.toString();
				_str=_str.substring(_str.indexOf(":")+1,_str.lastIndexOf("]"));
				
			}catch(error:Error){
				_str='';
			}
			return _str;
		}
		//得到AR
		private function getAr(lrc:String):String{
			var _str:String=new String();
			try{
				var _arr:Array=lrc.match(REG_AR);
				_str=_arr.toString();
				_str=_str.substring(_str.indexOf(":")+1,_str.lastIndexOf("]"));
				return _str;
			}catch(error:Error){
				_str='';
			}
			return _str;
		}
		//得到AL
		private function getAl(lrc:String):String{
			var _str:String=new String();
			try{
				var _arr:Array=lrc.match(REG_AL);
				_str=_arr.toString();
				_str=_str.substring(_str.indexOf(":")+1,_str.lastIndexOf("]"));
				
			}catch(error:Error){
				_str"";
			}
			return _str;
		}
		//得到BY
		private function getBy(lrc:String):String{
			var _str:String=new String();
			try{
				var _arr:Array=lrc.match(REG_BY);
				_str=_arr.toString();
				_str=_str.substring(_str.indexOf(":")+1,_str.lastIndexOf("]"));
			}catch(error:Error){
				_str="";
			}
			return _str;
		}
		//得到LRC内容数组
		private function getLrcContext(LRC:String):Array{
			var _arr:Array=new Array();
			try{
			_arr=LRC.match(REG_LRC_CONTEXT);
			_arr=getLrcTimeAndContext(_arr);
			
			}catch(error:Error){
				_arr=new Array("sorry","no lrc");
			}
			return _arr;
		}
		private function getLrcTimeAndContext(arr:Array):Array{
			var _arr:Array=new Array();
			
			var lrcInfo:Array;
			var tempArr:Array;
			for(var i:int=arr.length-1;i>=0;i--){
				tempArr=arr[i].match(REG_TIME);
				for(var j:int=tempArr.length-1;j>=0;j--){
					//得到每一组的歌词时间和内容；
					lrcInfo=new Array();
					lrcInfo.lrcTime=transformNumber(tempArr[j]);
					lrcInfo.lrcContext=arr[i].toString().substr(arr[i].toString().lastIndexOf("]")+1);
					_arr.push(lrcInfo);
				}
			}
			return _arr;
		}
		private function transformNumber(str:String):Number{				
			//[02:38.09]=02*60*1000+38*1000+09=?
			var num:Number=new Number();
			var _arr:Array=str.match(REG_TIME_SPLICE);
			if(_arr[0]!=null||_arr[1]!=null||_arr[2]!=null){
				num=(Number(_arr[0]) *60+Number(_arr[1]))*1000+Number(_arr[2]);
			}
			return num;
		}
		
	}
}